package tc.oc.commons.core.inspect;
import java.util.Collection;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.apache.commons.lang.StringEscapeUtils;
import tc.oc.commons.core.util.Chain;
public class TextInspector implements Inspector<String> {
@Override
public String scalar(Object value, Inspection options) {
if(options.quote()) {
if(value instanceof Character) {
final char c = (char) value;
switch(c) {
case '\'': return "'\\''";
case '"': return "'\"'";
default: return "'" + StringEscapeUtils.escapeJava(String.valueOf(c)) + "'";
}
} else if(value instanceof String) {
return "\"" + StringEscapeUtils.escapeJava((String) value) + "\"";
}
}
if(value instanceof Class) {
// Short class names are usually enough
return ((Class) value).getSimpleName();
}
// everything else
return String.valueOf(value);
}
@Override
public <E> String collection(Collection<E> collection, Stream<String> elements, Inspection options) {
return "[" + elements.collect(Collectors.joining(", ")) + "]";
}
@Override
public <K, V> String map(Map<K, V> map, Stream<Map.Entry<String, String>> entries, Inspection options) {
return "{" + entries.map(entry -> entry.getKey() + " -> " + entry.getValue())
.collect(Collectors.joining(", ")) +
"}";
}
@Override
public String reference(Inspectable inspectable, Inspection options) {
return inspectable.identify();
}
@Override
public String inspectable(Inspectable inspectable, Stream<Map.Entry<String, String>> properties, Inspection options) {
return "{" + Stream.concat(Stream.of(inspectable.identify()),
properties.map(p -> p.getKey() + "=" + p.getValue()))
.collect(Collectors.joining(" ")) +
"}";
}
@Override
public String exception(InspectionException e, Inspection options) {
return "(" + e.getClass().getSimpleName() + ": " + e.getMessage() + ")";
}
@Override
public String cycle(Object value, Chain<Object> path, Inspection options) {
return "...";
}
}